using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using Coordenadas;

namespace MapaMovil
{
    class Utiles
    {
        public static double myParseCoord(String coord)
        {
            int idxComa = coord.IndexOf(",");
            int idxPunto = coord.IndexOf(".");
            if (idxComa < 0 && idxPunto < 0)
                return Double.Parse(coord);
            if (idxComa < 0)
                idxComa = idxPunto;
            String pEntera = coord.Substring(0, idxComa);
            String pDecimal = coord.Substring(idxComa + 1);
            String mantisaS = pEntera + pDecimal;
            double mantisa = Double.Parse(mantisaS);
            double exp = pDecimal.Length;
            return mantisa * Math.Pow(10, -exp);
        }

        /* Calculo de distancia obtenida desde 
         * http://www.codeproject.com/csharp/distancebetweenlocations.asp
         */
        public static double distancia(LatLong ll1,LatLong ll2){
            /*
                The Haversine formula according to Dr. Math.
                http://mathforum.org/library/drmath/view/51879.html
                
                dlon = lon2 - lon1
                dlat = lat2 - lat1
                a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
                c = 2 * atan2(sqrt(a), sqrt(1-a)) 
                d = R * c
                
                Where
                    * dlon is the change in longitude
                    * dlat is the change in latitude
                    * c is the great circle distance in Radians.
                    * R is the radius of a spherical Earth.
                    * The locations of the two points in 
                        spherical coordinates (longitude and 
                        latitude) are lon1,lat1 and lon2, lat2.
            */
            
            double dDistance = Double.MinValue;
            double dLat1InRad = ll1.Latitud * (Math.PI / 180.0);
            double dLong1InRad = ll1.Longitud * (Math.PI / 180.0);
            double dLat2InRad = ll2.Latitud  * (Math.PI / 180.0);
            double dLong2InRad = ll2.Longitud * (Math.PI / 180.0);

            double dLongitude = dLong2InRad - dLong1InRad;
            double dLatitude = dLat2InRad - dLat1InRad;

            // Intermediate result a.
            double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
                       Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) *
                       Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);

            // Intermediate result c (great circle distance in Radians).
            double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));
            // Distance.
            // const Double kEarthRadiusMiles = 3956.0;
            const Double kEarthRadiusmts = 6376500;
            dDistance = kEarthRadiusmts * c;
            return dDistance;
        }
    }
}
